#include "head.h"
#include "process_command.h"
#include "epoll.h"
#include "tcpInit.h"
#define SOCKET_READY 1024

int handle(client_info_t *client_info)
{
    printf("进到了handle里面\n");
    while (1)
    {
        train_t train;
        bzero(&train, sizeof(train));
        recv(client_info->net_fd, &train.len, sizeof(train.len), MSG_WAITALL);
        recv(client_info->net_fd, &train.data, train.len, MSG_WAITALL);
        printf("%s\n", train.data);

        char order[1024];
        strcpy(order, train.data);
        if (!strcmp(order, "cd"))
        {
            // 调用cd处理函数
            cd_work(client_info);
        }
        else if (!strcmp(order, "ls"))
        {
            // 调用ls处理函数
            ls_work(client_info);
        }
        else if (!strcmp(order, "pwd"))
        {
            // 调用pwd处理函数
            pwd_work(client_info);
        }
        else if (!strcmp(order, "puts"))
        {
            // 调用puts处理函数
            puts_work(client_info);
        }
        else if (!strcmp(order, "gets"))
        {
            // 调用gets处理函数
            gets_work(client_info);
        }else if(!strcmp(order, "remove")){
            remove_work(client_info);
        }
        else
        {
            // 处理无效命令
            // TODO...
            int ret = recv(client_info->net_fd, train.data, sizeof(int), 0);
            if(ret == 0){
                printf("客户端断开连接\n");
                break;
            }
            printf("输入了无效命令！\n");
        }
    }
}

int main(int argc, char *argv[])
{

    // 用来接收返回值检错的
    ssize_t recv_bytes;

    // 端口IP
    /*
        if (argc != 3) {
            fprintf(stderr, "Usage: %s <ip_address> <port>\n", argv[0]);
            return EXIT_FAILURE;
         }
    */

    // 这里的ip和port字符串，到时候用命令行传入进来
    const char *ip = "192.168.16.130";
    const char *port = "8080";
    int socket_fd;

    tcp_init(&socket_fd, ip, port);
    printf("tcp_init执行结束\n");

    /*
    考虑第一次accept在while里面做，不单独对第一个在外面accept了
    // 获取连接
        int net_fd = accept(socket_fd, NULL, NULL);
    */
    // 创建epoll对象
    int epoll_fd = epoll_create(1);
    // 设置监听集合
    epoll_add(epoll_fd, socket_fd);
    printf("epoll_add之后\n");
    client_info_t client_info; // 记录用户连接信息
    memset(&client_info, 0, sizeof(client_info));

    while (1)
    {
        // 就绪接收数组
        struct epoll_event epoll_ready[SOCKET_READY];
        // 开始监听
        int res_wait = epoll_wait(epoll_fd, epoll_ready, SOCKET_READY, -1);
        // 遍历就绪集合
        for (int i = 0; i < res_wait; i++)
        {
            if (epoll_ready[i].data.fd == socket_fd)
            {
                // 走到这里意味着有新的客户端发来了连接
                int new_net_fd = accept(socket_fd, NULL, NULL);
                printf("net_fd = %d\n", new_net_fd);
                // 初始化该客户端的连接信息
                // 其实这部分内容及其相应客户端命令的工作应该交给线程池来做，但是第一版就当做只有一个客户端，监听也就只是一直监听这个客户端连接
                client_info.net_fd = new_net_fd;
                strcpy(client_info.virtual_global_path, "/wp_user/");
                strcpy(client_info.global_path, "/home/derderpro/wp_user/"); // 满足接收多个客户端的连接时，这里的字符串就不能简单的这样写了，需要拼接用户名
                // 这里注意：创建客户端逻辑上的根目录是新客户端用户注册该做的事情，我们默认连接进来的客户端都是老用户，都已经注册过了，即已经有该客户端的逻辑根目录了
                // 监听该客户端是否发来命令
                //epoll_add(epoll_fd, client_info.net_fd);
                /*printf("客户端连接成功！\n");
                train_t train;
                bzero(&train, sizeof(train));
                recv(client_info.net_fd, &train.len, sizeof(train.len), MSG_WAITALL);
                recv(client_info.net_fd, &train.data, train.len, MSG_WAITALL);
                printf("%s\n",train.data);*/
                handle(&client_info);
            }
        }
    }

    close(epoll_fd);
    close(socket_fd);
    return 0;
}
